﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Malkafly.EFDorsal.BusinessLayer;
namespace Malkafly.EFDorsal
{
    public partial class EFDorsal : Form
    {
        public List<EntidadeGenerica> listEntidades { get; set; }
        public EntityConfiguracoes Configuracoes { get; set; }
        public EFDorsal()
        {
            InitializeComponent();

            txtSelect.Text = Templates.resSelect;
            txtInsert.Text = Templates.resInsert;
            txtUpdate.Text = Templates.resUpdate;
            txtDelete.Text = Templates.resDelete;
            txtClasse.Text = Templates.resClasse;
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtNSDataLayer.Text) || string.IsNullOrEmpty(txtNSProjeto.Text) || string.IsNullOrEmpty(txtOutput.Text))
            {
                MessageBox.Show("Os campos de Namaspace e Output são obrigatórios.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                openFileDialog1.Title = "EDMX Entity Framwork File";
                openFileDialog1.Filter = "ADO.NET Entity Data Model Designer | *.edmx";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    EntityConfiguracoes confs = new EntityConfiguracoes();
                    confs.NamespaceData = txtNSDataLayer.Text;
                    confs.NamespaceProjeto = txtNSProjeto.Text;
                    confs.OutputFolder = txtOutput.Text;

                    listEntidades = new ProcessaTemplate().Processa(openFileDialog1.OpenFile(), ref confs);
                    if (listEntidades.Count > 0)
                    {
                        MessageBox.Show(listEntidades.Count.ToString() + " Entidades carregadas com sucesso.", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Configuracoes = confs;

                        CarregaEntidades();
                    }
                    else
                    {
                        MessageBox.Show("Nenhum arquivo foi gerado.\nClique em log para mais detalhes.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void CarregaEntidades()
        {
            TreeNode[] nodePais = new TreeNode[listEntidades.Count];
            for (int pai = 0; pai < listEntidades.Count; pai++)
            {

                TreeNode[] nodeFilhos = new TreeNode[listEntidades[pai].EntityProperty.Count];

                for (int filho = 0; filho < listEntidades[pai].EntityProperty.Count; filho++)
                {
                    if (!string.IsNullOrEmpty(listEntidades[pai].EntityProperty[filho].PropertyName))
                    {
                        string nodeDesc = string.Format("({0}) {1} {2}"
                                                        ,listEntidades[pai].EntityProperty[filho].PropertyType
                                                        ,listEntidades[pai].EntityProperty[filho].PropertyName
                                                        ,(listEntidades[pai].EntityProperty[filho].isKey ? "chave" : string.Empty)
                                                        );
                        nodeFilhos[filho] = new TreeNode(nodeDesc);
                        
                    }
                }
                nodePais[pai] = new TreeNode(listEntidades[pai].EntityType, nodeFilhos);
            }
            treeView1.Nodes.AddRange(nodePais);
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                if (!string.IsNullOrEmpty(folderBrowserDialog1.SelectedPath))
                {
                    txtOutput.Text = folderBrowserDialog1.SelectedPath;
                }
            }
        }

        private void toolStripButton3_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show(string.Format("Os arquivos .cs serão salvos na pasta {0}.\nDeseja prosseguir?", txtOutput.Text), "Gerar arquivos", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                if (listEntidades != null)
                {
                    new ProcessaTemplate().GerarClass(listEntidades, Configuracoes);
                }
                else
                {
                    MessageBox.Show("Você precisa selecionar um arquivo .edmx do Entity Framework.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void toolStripSplitButton1_Click(object sender, EventArgs e)
        {
            AboutBox sobre = new AboutBox();
            if (sobre.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                sobre.Close();
            }
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            txtClasse.Enabled = !txtClasse.Enabled;
            txtSelect.Enabled = !txtSelect.Enabled;
            txtInsert.Enabled = !txtInsert.Enabled;
            txtUpdate.Enabled = !txtUpdate.Enabled;
            txtDelete.Enabled = !txtDelete.Enabled;
            //btnEditar.Text = (txtSelect.Enabled) ? "Desabilitar edição" : "Habilitar edição";
        }
    }
}
